home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / util / boot / BlizKick.lha / BlizKick / bkapi.lha / bkapi / loadresident.c < prev    next >
C/C++ Source or Header  |  2000-01-17  |  4KB  |  202 lines

  1. /* BlizKick EXTRES allocation API functions - loadresident.
  2.  
  3.    Written by Harry "Piru" Sintonen, Jan 2000.
  4.    Public Domain.
  5. */
  6.  
  7. #include <exec/types.h>
  8. #include <exec/memory.h>
  9.  
  10. #define __USE_SYSBASE 1
  11.  
  12. #include <proto/exec.h>
  13. #include <proto/dos.h>
  14.  
  15. #include "myregargs.h"
  16. #include "bkapi.h"
  17.  
  18. #define BKMODULE_ID 0x707A4E75
  19.  
  20. /* protos */
  21. int __saveds main(void);
  22. void makeids(char *, LONG, char *);
  23. LONG installpatches(char **);
  24. LONG __saveds ASM readfunc(REG(d1,BPTR),REG(d2,void *),REG(d3,LONG));
  25.  
  26.  
  27. #ifdef __SASC
  28. void __regargs __chkabort(void);
  29. void __regargs _CXBRK(void);
  30.  
  31. struct ExecBase *SysBase;
  32. struct DosLibrary *DOSBase;
  33. #endif
  34.  
  35. const char *verstring  = "$VER: loadresident 1.0.1 (17.1.00)";
  36.  
  37. int __saveds main(void) {
  38.   ULONG ver, largest;
  39.   struct RDArgs *rdargs;
  40.   LONG array[2];
  41.   struct Resident *res = NULL;
  42.   ULONG start, len;
  43.   char ids[77];
  44.  
  45. #ifdef __SASC
  46.   SysBase = *((struct ExecBase **)(4L));
  47.   if ( (DOSBase = (struct DosLibrary *) OpenLibrary("dos.library", 37L))
  48.        == NULL ) return 0;
  49. #endif
  50.  
  51.   ver = er_init();
  52.  
  53.   if (ver) {
  54.  
  55.     /* make sanity check... */
  56.     largest = er_availmem(MEMF_LARGEST);
  57.     if (largest != 0xFFFFFFFF) {
  58.  
  59.        array[1] = 0;
  60.        if ( (rdargs = ReadArgs("MODULES/M,REBOOT/S",array,NULL)) ) {
  61.  
  62.          Printf("loadresident 1.0.1 by Harry \"Piru\" Sintonen\n");
  63.  
  64.          if (array[0]) {
  65.            if (installpatches((char **) array[0])) {
  66.              if (array[1]) {
  67.                Printf("Rebooting in 1 second...\n");
  68.                Delay(50);
  69.                ColdReboot();
  70.              }
  71.            }
  72.          } else {
  73.  
  74.            start = er_getarea(&len);
  75.  
  76.            Printf("\nEXTRESBUF at $%08lx - $%08lx\n"
  77.                   "Free: %ld bytes  Largest: %ld bytes\n"
  78.                   "Resident tags:\n\n",
  79.                   start, start + len - 1, er_availmem(0),
  80.                   er_availmem(MEMF_LARGEST));
  81.  
  82.            er_lock();
  83.            while ( (res = er_nextresident(res)) ) {
  84.              if (res->rt_IdString) {
  85.                makeids(ids, 77, res->rt_IdString);
  86.              } else {
  87.                makeids(ids, 77, res->rt_Name);
  88.              }
  89.              Printf("$%08lx: %s\n", (LONG) res, (LONG) ids);
  90.            }
  91.            er_unlock();
  92.  
  93.          }
  94.  
  95.          FreeArgs(rdargs);
  96.        } else {
  97.          PrintFault(IoErr(),NULL);
  98.        }
  99.  
  100.     } else {
  101.  
  102.       Printf("BlizKick EXTRES buffer memheader INSANE!!\n");
  103.  
  104.     }
  105.  
  106.   } else {
  107.  
  108.     Printf("BlizKick EXTRES buffer API not found!\nRequires BlizKick 1.20+\n");
  109.  
  110.   }
  111.  
  112. #ifdef __SASC
  113.   CloseLibrary( (struct Library *) DOSBase);
  114. #endif
  115.   return 0;
  116. }
  117.  
  118.  
  119. void makeids(char *dst, LONG len, char *src) {
  120.   unsigned char *s, *d, c;
  121.  
  122.   if (--len < 0) return;
  123.  
  124.   s = (unsigned char *) src;
  125.   d = (unsigned char *) dst;
  126.  
  127.   while (len && (c = *s++)) {
  128.     if (c>31) { *d++ = c; len--; }
  129.   }
  130.   *d = 0;
  131. }
  132.  
  133. #define MAXSEGS 64
  134.  
  135. LONG installpatches(char **patches) {
  136.   BPTR fh, seg, *segsp, segs[MAXSEGS] = {0};
  137.   LONG stack, *pt, r, ret = 1, cnt = 0;
  138.   LONG funcarray[3] = {(LONG) readfunc,
  139.                        (LONG) er_allocmem,
  140.                        (LONG) er_free};
  141.  
  142.   segsp = segs;
  143.  
  144.   while ( (cnt<MAXSEGS) && ret && (*patches) ) {
  145.  
  146.     Printf("Loading resident module %s... ", (LONG) *patches);
  147.  
  148.     if ( (fh = Open(*patches, MODE_OLDFILE)) ) {
  149.  
  150.       stack = 4096;
  151.       if ( (seg = InternalLoadSeg(fh, NULL, funcarray, &stack)) ) {
  152.  
  153.         *segsp++ = seg; cnt++;
  154.  
  155.         pt = (LONG *) ((ULONG) BADDR(seg) + 4 );
  156.  
  157.         if (pt[0] == BKMODULE_ID) {
  158.  
  159.           Printf("failed!\nMust not use BlizKick module here!\n");
  160.           SetIoErr(0);
  161.           ret = 0;
  162.  
  163.         } else {
  164.           Printf("ok\n");
  165.         }
  166.  
  167.       } else ret = 0;
  168.  
  169.       Close(fh);
  170.  
  171.     } else ret = 0;
  172.  
  173.     patches++;
  174.   }
  175.  
  176.   if (cnt >= MAXSEGS) {
  177.     SetIoErr(ERROR_TOO_MANY_ARGS);
  178.     ret = 0;
  179.   }
  180.  
  181.   if (!ret) {
  182.     PrintFault(IoErr(),NULL);
  183.  
  184.     for (r = 0; r < MAXSEGS; r++) {
  185.       if (segs[r]) {
  186.         InternalUnLoadSeg(segs[r], er_free);
  187.       }
  188.     }
  189.   }
  190.  
  191.   return ret;
  192. }
  193.  
  194.  
  195. LONG __saveds ASM readfunc(REG(d1,BPTR readhandle),
  196.                            REG(d2,void *buffer),
  197.                            REG(d3,LONG length)) {
  198.  
  199.   return Read(readhandle, buffer, length);
  200. }
  201.  
  202.